package com.travel.interceptor;

import com.travel.exception.UnauthorizedException;
import com.travel.utils.BaseContext;
import com.travel.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 登录检查拦截器
 * 用于校验 JWT 并提取用户信息
 */
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {

    /**
     * 校验 JWT
     *
     * @param request  HTTP 请求对象
     * @param response HTTP 响应对象
     * @param handler  被拦截的处理器
     * @return 是否放行
     * @throws Exception 如果未认证则抛出异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 从请求头中获取令牌
        String token = request.getHeader("token");

        // 2. 检查令牌是否存在
        if (token == null || token.isEmpty()) {
            log.warn("请求头中缺少 token");
            throw new UnauthorizedException("Token is missing");
        }

        try {
            // 3. 校验令牌并解析
            log.info("jwt校验: {}", token);
            Claims claims = JwtUtils.parseJWT(token);

            // 4. 从 Token 中提取用户 ID
            Long userId = Long.valueOf(claims.get("userId").toString());
            log.info("当前用户的 ID: {}", userId);

            // 5. 将用户 ID 存入 BaseContext，方便后续业务逻辑使用
            BaseContext.setCurrentId(userId);

            // 6. 校验通过，放行
            return true;
        } catch (Exception ex) {
            // 7. 校验失败，记录日志并抛出未认证异常
            log.error("JWT 校验失败: {}", ex.getMessage());
            throw new UnauthorizedException("Invalid or expired token");
        }
    }
}
